<?php


namespace App\Http\Controllers\Admin;

use App\Models\Admin;
use App\Models\Student;
use App\Models\Teacher;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

/**

 * excel的使用
 */
class ExcelController extends CommonController
{
    public function index(){
        //实例化一个电子表格
        $spreadsheet = new Spreadsheet();
        //电子表格元数据
        $spreadsheet->getProperties()
            ->setCreator("Maarten Balliauw")
            ->setLastModifiedBy("Maarten Balliauw")
            ->setTitle("Office 2007 XLSX Test Document")
            ->setSubject("Office 2007 XLSX Test Document")
            ->setDescription(
                "Test document for Office 2007 XLSX, generated using PHP classes."
            )
            ->setKeywords("office 2007 openxml php")
            ->setCategory("Test result file");
        //设置电子表格的活动工作表
        //以下代码行将活动工作表索引设置为第一工作表：
        $spreadsheet->setActiveSheetIndex(0);
        //还可以按其名称/标题设置活动工作表
        $spreadsheet->setActiveSheetIndexByName('DataSheet');
        //将当前活动的工作表更改为名为“ DataSheet”的工作表。
        //将日期或时间写入单元格
        //在Excel中，日期和时间存储为数字值，
        //用于计算自1900-01-01起经过的天数。
        //例如，日期'2008-12-31'表示为39813。
        //可以在Microsoft Office Excel中对此日期进行验证，
        //方法是在单元格中输入该日期，然后将数字格式更改为“常规”，
        //以便显示真实的数值。同样，“ 3:15 AM”表示为0.135417。
        //PhpSpreadsheet使用UST（通用标准时间）日期和时间值，
        //但不进行内部转换。因此，开发人员应确保传递给日期/时间转换函数的值是UST。

        //在单元格中写入日期值由两行代码组成。选择最适合您的方法。这里有些例子：
        // MySQL-like timestamp '2008-12-31' or date string
        \PhpOffice\PhpSpreadsheet\Cell\Cell::setValueBinder( new \PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder() );
       //第一种
        $spreadsheet->getActiveSheet()
            ->setCellValue('D1', '2008-12-31');
        //第二种
        $spreadsheet->getActiveSheet()->getStyle('D2')
         ->getNumberFormat()
        ->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);

        // PHP-time (Unix time)
        $time = gmmktime(0,0,0,12,31,2008); // int(1230681600)
        $spreadsheet->getActiveSheet()
        ->setCellValue('D3', \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($time));
        $spreadsheet->getActiveSheet()->getStyle('D3')
        ->getNumberFormat()
        ->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);

        // Excel-date/time
        $spreadsheet->getActiveSheet()->setCellValue('D1', 39813);
        $spreadsheet->getActiveSheet()->getStyle('D1')
            ->getNumberFormat()
            ->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);
       // 上面输入日期的方法都会产生相同的结果。
        // \PhpOffice\PhpSpreadsheet\Style\NumberFormat提供了许多预定义的日期格式。

       // 该\PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel()方法
        //还可以与PHP DateTime对象一起使用。
        //类似地，可以以相同的方式输入时间（或日期和时间值）：只需记住使用适当的格式代码即可。

        //可以使用字体，边框，填充，...样式信息来格式化单元格。
        //例如，可以将单元的前景色设置为红色，
        //并向右对齐，将边框设置为黑色和粗边框样式。让我们在单元格B2上执行此操作：

        $spreadsheet->getActiveSheet()->getStyle('B2')
            ->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED);
        $spreadsheet->getActiveSheet()->getStyle('B2')
            ->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT);
        $spreadsheet->getActiveSheet()->getStyle('B2')
            ->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK);
        $spreadsheet->getActiveSheet()->getStyle('B2')
            ->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK);
        $spreadsheet->getActiveSheet()->getStyle('B2')
            ->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK);
        $spreadsheet->getActiveSheet()->getStyle('B2')
            ->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK);
        $spreadsheet->getActiveSheet()->getStyle('B2')
            ->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID);
        $spreadsheet->getActiveSheet()->getStyle('B2')
            ->getFill()->getStartColor()->setARGB('FFFF0000');
        //getStyle()还接受单元格范围作为参数。例如，您可以在一系列单元格上设置红色背景色：

        $spreadsheet->getActiveSheet()->getStyle('B3:B7')->getFill()
            ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
            ->getStartColor()->setARGB('FFFF0000');
        //提示建议使用例如getStyle（'A1：M500'）一次对许多单元格进行样式设置，而不是在循环中分别对单元格进行样式设置。与遍历单元格和分别设置样式相比，这要快得多。


        // 用字符串值设置单元格A1
        $spreadsheet->getActiveSheet()->setCellValue('A1', 'PhpSpreadsheet');

        // 用数值设置单元格A2
        $spreadsheet->getActiveSheet()->setCellValue('A2', 12345.6789);
        // 用布尔值设置单元格A3
        $spreadsheet->getActiveSheet()->setCellValue('A3', TRUE);

        // 用公式设置单元格A4
        $spreadsheet->getActiveSheet()->setCellValue(
            'A4',
            '=IF(A3, CONCATENATE(A1, " ", A2), CONCATENATE(A2, " ", A1))'
        );
        //或者，您可以检索单元格对象，然后调用单元格的`setValue()`方法：
        $spreadsheet->getActiveSheet()
            ->getCell('B8')
            ->setValue('Some value');
        //创建一个新的Xlsx写入器。
        $writer = new Xlsx($spreadsheet);
        //保存PhpSpreadsheet到文件。
        $writer->save('hello world.xlsx');


    }
    public function index3(){

        //实例化一个电子表格
        $spreadsheet = new Spreadsheet();
        // 用字符串值设置单元格A1
        $spreadsheet->getActiveSheet()->setCellValue('A1', 'PhpSpreadsheet');

        // 用数值设置单元格A2
        $spreadsheet->getActiveSheet()->setCellValue('A2', 12345.6789);
        // 用布尔值设置单元格A3
        $spreadsheet->getActiveSheet()->setCellValue('A3', TRUE);

        // 用公式设置单元格A4
        $spreadsheet->getActiveSheet()->setCellValue(
            'A4',
            '=IF(A3, CONCATENATE(A1, " ", A2), CONCATENATE(A2, " ", A1))'
        );
        //或者，您可以检索单元格对象，然后调用单元格的`setValue()`方法：
        $spreadsheet->getActiveSheet()
            ->getCell('B8')
            ->setValue('Some value');
        //创建一个新的Xlsx写入器。
        $writer = new Xlsx($spreadsheet);
        //保存PhpSpreadsheet到文件。
        $writer->save('hello world.xlsx');


    }
    public function index2(){
        //实例化一个电子表格
        $spreadsheet = new Spreadsheet();
        //新建一个工资表
        $sheet = $spreadsheet->getActiveSheet();
        //设置单元格值。
        //A1 表示 坐标
        //Hello World ! 表示值
        $sheet->setCellValue('A1', 'Hello World !');
        //创建一个新的Xlsx写入器。
        $writer = new Xlsx($spreadsheet);
        //保存PhpSpreadsheet到文件。
        $writer->save('hello world.xlsx');

    }


    public function index1(){
        $data = Student::get(['name','student_code'])->toArray();
        $title = ['姓名', '学号','语文','数学','英语'];
        // Create new Spreadsheet object
        $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();

        // 方法一，使用 setCellValueByColumnAndRow
        //表头
        //设置单元格内容
        foreach ($title as $key => $value) {
            // 单元格内容写入
            $sheet->setCellValueByColumnAndRow($key + 1, 1, $value);
        }
        $row = 2; // 从第二行开始
        foreach ($data as $item) {
            $column = 1;
            foreach ($item as $value) {
                // 单元格内容写入
                $sheet->setCellValueByColumnAndRow($column, $row, $value);
                $column++;
            }
            $row++;
        }
        // 方法二，使用 setCellValue
        //表头
        //设置单元格内容
        $titCol = 'A';
        foreach ($title as $key => $value) {
            // 单元格内容写入
            $sheet->setCellValue($titCol . '1', $value);
            $titCol++;
        }
        $row = 2; // 从第二行开始
        foreach ($data as $item) {
            $dataCol = 'A';
            foreach ($item as $value) {
                // 单元格内容写入
                $sheet->setCellValue($dataCol . $row, $value);
                $dataCol++;
            }
            $row++;
        }
        $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');

        // Redirect output to a client’s web browser (Xlsx)
      /*  header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="01simple.xlsx"');
        header('Cache-Control: max-age=0');
        // If you're serving to IE 9, then the following may be needed
        header('Cache-Control: max-age=1');

        // If you're serving to IE over SSL, then the following may be needed
        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
        header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
        header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
        header('Pragma: public'); // HTTP/1.0*/
      //  $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
       // $writer->save('php://output');
        $writer->save("uploads/excel/".time().".xlsx");

        dd(1);
        exit;
    }

}
